/*******************************************************************************************************************************
1、数据验证类。
*******************************************************************************************************************************/
/*
 * （1）整数验证。
 *  函数名称：isNumber(value,i)
 *  输入参数：value，字符串型，待验证值；
              i，整型，“1”表示整数；“2”表示正整数（不含0）；“3”表示负整数（不含0）；“4”表示正整数（含0）；“5”表示负整数验证（含0）。
 *  输出参数：布尔型。
 *  应用实例：
 */ 
function isNumber(value,i) {
    var bool = false;
    if(value == "") return bool;
    else tmpStr = value;
    switch(i) {
        case 1: if(/^-?[0-9]\d*$/.test(tmpStr)) bool = true;break;
        case 2: if(/^[1-9]\d*$/.test(tmpStr))   bool = true;break;
        case 3: if(/^-[1-9]\d*$/.test(tmpStr))  bool = true;break;
        case 4: if(/^[0-9]\d*$/.test(tmpStr))   bool = true;break;
        case 5: if(/^-[0-9]\d*$/.test(tmpStr))  bool = true;break;
    }
    return bool;
}
/*
 * （2）小数验证。
 *  函数名称：isNumeric(value,i)
 *  输入参数：value，字符串型，待验证值；
              i，整型，“1”表示小数；“2”表示正小数（不含0）；“3”表示负小数（不含0）；“4”表示正小数（含0）；“5”表示负小数验证（含0）。
 *  输出参数：布尔型。
 *  应用实例：
 */ 
function isNumeric(value,i) {
    var bool = false,tmpArr,tmpStr;
    if(value == "") return false;
    else tmpStr = value;
    if(tmpStr == 0) {
        if(i == 2||i == 3) return false;
        else return true;
    }
    if(tmpStr.substring(0,tmpStr.indexOf(".")) != tmpStr.substring(0,tmpStr.lastIndexOf("."))) return false;
    tmpArr=tmpStr.split(".");
    switch(i) {
        case 1: bool = isNumber(tmpArr[0],1)&&isNumber(tmpArr[1],4);break;
        case 2: bool = (tmpArr[0].indexOf("-")<0)&&isNumber(tmpArr[0],4)&&isNumber(tmpArr[1],4);break;
        case 3: bool = (tmpArr[0].indexOf("-")>=0)&&isNumber(tmpArr[0],5)&&isNumber(tmpArr[1],4);break;
        case 4: bool = (tmpArr[0].indexOf("-")<0)&&isNumber(tmpArr[0],4)&&isNumber(tmpArr[1],4);break;
        case 5: bool = (tmpArr[0].indexOf("-")>=0)&&isNumber(tmpArr[0],5)&&isNumber(tmpArr[1],4);break;
    }
    return bool;
}
/*
 * （3）数字位数验证。
 *  函数名称：isNumericPos(value,i,j)
 *  输入参数：value，整型，待验证值；i，整型，整数位数；j，整型，小数位数。
 *  输出参数：布尔型。
 *  应用实例：
 */ 
function isNumericPos(value,i,j) {
    var bool=true,tmpArr;
    if(!isNumeric(value,2)&&!isNumber(value,4)) bool = false;
    else {
        if(value.indexOf(".") >= 0) {
            tmpArr = value.split(".");
            if(tmpArr[0].length>i&&i!=0) bool = false;
            if(tmpArr[1].length>j)       bool = false;
        }
    }
    return bool;
}
/*
 * （4）日期验证。
 *  函数名称：isDate(value)
 *  输入参数：value，字符串型，待验证值。
 *  输出参数：布尔型。
 *  应用实例：
 */ 
function isDate(value) {
    var maxDay,reg = value.match(/^(\d{1,4})(-|\/)[0]{0,1}(\d{1,2})\2(\d{1,2})$/); 
    if(reg == null) return false;
    maxDay = getMaxDay(parseInt(reg[1]),parseInt(reg[3]));
    if(reg[3]>12||reg[3]<=0) return false;
    if(reg[4]>maxDay||reg[4]<=0) return false;
    var d = new Date(reg[1], reg[3]-1, reg[4]); 
    return (d.getFullYear() == reg[1]&&(d.getMonth()+1) == reg[3]&&d.getDate()==reg[4]); 
}
/*
 * （5）开始日期是否大于结束日期。
 *  函数名称：isDateCycle(startDate,endDate)
 *  输入参数：startDate，日期型，开始日期；endDate：日期型，结束日期。
 *  输出参数：布尔型。
 *  应用实例：
 */ 
function isDateCycle(startDate,endDate) {
    var miStart = Date.parse(startDate.replace(/\-/g,'/'));
    var miEnd = Date.parse(endDate.replace(/\-/g,'/'));
    return (miEnd-miStart)/(1000*24*3600)<0;
}
/*
 * （6）月度天数获取。
 *  函数名称：getMaxDay(yvalue,mvalue)
 *  输入参数：yvalue，整型，年度；mvalue，整型，月度。
 *  输出参数：整型，月度天数。
 *  应用实例：
 */ 
function getMaxDay(yvalue,mvalue) {
    var maxDay = 0;
    if(!isNumber(yvalue,2)||!isNumber(mvalue,2))  return maxDay;
    switch(parseInt(mvalue)) {
        case 2:
            var year = parseInt(yvalue);
            if(year%100 == 0) {
                if(year%400 == 0) maxDay = 29;
                else maxDay = 28;
            } else {
                if(year%4 == 0) maxDay = 29;
                else maxDay = 28;
            }
        break;
        case 4:
        case 6:
        case 9:
        case 11: maxDay = 30;break;
        default: maxDay=31;break;
    }
    return maxDay;
}
/*
 * （7）两个对象值相等验证。
 *  函数名称：isEqual(objname1,objname2)
 *  输入参数：objname1，字符串型，对象1名称；objname2，字符串型，对象2名称。
 *  输出参数：布尔型。
 *  应用实例：
 */ 
function isEqual(objname1,objname2) {
    var obj1 = document.getElementsByName(objname1)[0];
    var obj2 = document.getElementsByName(objname2)[0];
    if(obj1.value == "") return false;
    if(obj1.value == obj2.value) {
        return true;	
    } else{ 
        return false;
    }
}
/*******************************************************************************************************************************
2、数据处理类。
*******************************************************************************************************************************/
/*
 * （1）字符串长度计算。
 *  函数名称：getStrLength(str)
 *  输入参数：str，字符串型，待处理字符串（英文算1个字节，中文算2个字节）。
 *  输出参数：整型，字符串长度。
 *  应用实例：
 */ 
function getStrLength(str) {
    len = 0;
    for (i = 0;i<str.length;i++) {
        if (str.charCodeAt(i)>255) len+=2; else len++;
    }
    return len;
}
/*
 * （2）字符串空格删除。
 *  函数名称：trimSpace(str,i)
 *  输入参数：str：字符串型，待处理字符串；
              i：整型，“1”表示删除所有空格，“2”表示删除头尾空格，“3”表示删除头部空格，“4”表示删除尾部空格。
 *  输出参数：字符串型。
 *  应用实例：
 */ 
function trimSpace(str,i) {
    var reg = "";
    if(str == "" || str == null) return "";
    switch(i) {
        case 1: reg = /\s/g; break;
        case 2: reg  =/(^\s*)|(\s*$)/g; break;
        case 3: reg = /^\s*/g; break;
        case 4: reg = /\s*$/g; break;
    }
    return str.replace(reg,"");
}
/*
 * （3）字符串分割保存于两个对象。
 *  函数名称：splitStrToObj(str,splits,objname1,objname2)
 *  输入参数：str，字符串型，目标字符串；splits，字符串型，分割符；
              objname1，字符串型，第１个对象名称；objname2，字符串型，第２个对象名称。
 *  输出参数：
 *  应用实例：
 */ 
function splitStrToObj(str,splits,objname1,objname2) {
    var firvalue = "";
    var secvalue = "";
    try {
        if(str!="") {
            var arr = str.split(splits);
            firvalue = arr[0];
            secvalue = arr[1];
        }
        document.getElementsByName(objname1)[0].value = firvalue;
        document.getElementsByName(objname2)[0].value = secvalue;
    } catch(err) {
        alert(err.message);
    }
}
/*
 * （4）日期时间计算。
 *  函数名称：setObjDate(sobjname,tobjname,sign1,interv1,sign2,interv2)
 *  输入参数：sobjname，字符串型，源对象名称；tobjname，字符串型，目标对象名称；
              sign1，字符串型，“y”表示年，“q”表示季度，“m”表示月，“w”表示星期，“d”表示天，“h”表示时，“mi”表示分，“s”表示秒；
              interv1，整型，间隔数字，以sign1为单位；sign2，字符串型，同sign1；
              interv2，整型，间隔数字，以天为单位。
 *  输出参数：
 *  应用实例：
 */ 
function setObjDate(sobjname,tobjname,sign1,interv1,sign2,interv2) {
	if(sobjname.value == null || sobjname.value == "") return;
	var tobjname = document.getElementsByName(tobjname)[0];
	var temp = sobjname.value.replaceAll("-","/");  
	var rtnvalue = dateAcc(sign1,interv1,new Date(temp),interv2);
	tobjname.value = formateDate(rtnvalue,sign2);
}
//计算 
function dateAcc(sign,interv1,date,interv2) {
    interv2 = 0 || interv2;
    switch(sign) {
        case "y": {date.setFullYear(date.getFullYear()+interv1);break;}
        case "q": {date.setMonth(date.getMonth()+interv1*3);break;}
        case "m": {date.setMonth(date.getMonth()+interv1);break;}
        case "w": {date.setDate(date.getDate()+interv1*7);break;}
        case "d": {date.setDate(date.getDate()+interv1);break;}
        case "h": {date.setHours(date.getHours()+interv1);break;}
        case "mi":{date.setMinutes(date.getMinutes()+interv1);break;}
        case "s": {date.setSeconds(date.getSeconds()+interv1);break;}
        default:  {date.setDate(d.getDate()+interv1);break;}
    }
    if(null != interv2 && ""!=interv2){
        date.setDate(date.getDate()+interv2);
    }
    return date;
}
//格式化
function formateDate(date,sign) {  
    var ryear = date.getFullYear();
    var rmonth = (date.getMonth()+1);
    rmonth = rmonth<10?"0"+rmonth:rmonth;
    var rday = date.getDate();
    rday = rday<10?"0"+rday:rday;
    var rhour = date.getHours();
    var rmi = date.getMinutes();
    var rs = date.getSeconds();
    switch(sign) {
        case "y": {return (ryear);break;}
        case "q": {break;}
        case "m": {return (ryear+"-"+rmonth);break;}
        case "w": {break;}
        case "d": {return (ryear+"-"+rmonth+"-"+rday);break;}
        case "h": {return (ryear+"-"+rmonth+"-"+rday+" "+rhour);break;}
        case "mi":{return (ryear+"-"+rmonth+"-"+rday+" "+rhour+":"+rmi);break;}
        case "s": {return (ryear+"-"+rmonth+"-"+rday+" "+rhour+":"+rmi+":"+rs);break;}
        default:  {return (ryear+"-"+rmonth+"-"+rday);break;}
    }
}
/*******************************************************************************************************************************
3、业务应用类。
*******************************************************************************************************************************/
/*
 * （1）单个选择框重新获得排序号。
 *  函数名称：changeSort(fun,tabname,sortobj,sortfiled,sortnumobj,oldsortvalue,oldsortnumvalue,url)
 *  输入参数：fun，整型，“1”表示新增，“2”表示修改；tabname，字符串型，查询表名；
              sortobj，字符串型，当前选择框名；sortfiled, 字符串型，表字段（类别）；
              sortnumobj，字符串型，文本框名（排序号）；oldsortvalue，字符串型，选择框原选中值；
              oldsortnumvalue，字符串型，原排序号值；url，字符串型，提交地址。
 *  输出参数：失败：False，成功：排序号值。
 *  应用实例：
 */ 
function changeSort1(fun,tabname,sortobj,sortfiled,sortnumobj,oldsortvalue,oldsortnumvalue,url) { 
    if(fun == 2){
        if(sortobj.value == oldsortvalue) {
            sortnumobj.value = oldsortnumvalue;
            return ;
        }
    }
    var params  = {
        'tabname':tabname,
        'sortfiled':sortfiled,
        'sortValue':sortobj.value
    };
    $.ajax( {
        url: url,         //接收页面
        type: 'post',     //POST方式发送数据
        async: false,    //ajax同步
        data: params,
        success: function(msg) { 
            if(msg=='false') {
                alert("<s:text name=\'operate.error\'/>"); 
            }else {
                sortnumobj.value=msg;
            }
        }
    });
}
/*
 * （2）两个选择框重新获得排序号。
 *  函数名称：changeSort2(act,fun,tabname,sortobj,sortfiled,sortnumobj,oldsortvalue,oldsortnumvalue,url)
 *  输入参数：act，整型，“1”表示一个选择框, “2”表示两个选择框；
              fun，整型，“1”表示新增，“2”表示修改；tabname，字符串型，查询表名；
              sortobj，字符串型，当前选择框名；sortfiled, 字符串型，表字段（类别）；
              sortnumobj，字符串型，文本框名（排序号）；oldsortvalue，字符串型，选择框原选中值；
              oldsortnumvalue，字符串型，原排序号值；url，字符串型，提交地址。
 *  输出参数：失败：False，成功：排序号值。
 *  应用实例：
 */ 
function changeSort2(act,fun,tabname,sortobj,sortfiled,sortnumobj,oldsortvalue,oldsortnumvalue,url) { 
    if(fun == 2) {
        if(act==1) {
            if(sortobj == oldsortvalue) {
                sortnumobj.value = oldsortnumvalue;
                return ;
            }
        }else if(act==2) {
            var arrSort=sortobj.split(",");
            var arroldsortvalue=oldsortvalue.split(",");
            if(arrSort[0]==arroldsortvalue[0] && arrSort[1]==arroldsortvalue[1]) {
                sortnumobj.value = oldsortnumvalue;
                return ;
            }
        }else if(act==3) {
            var arrSort=sortobj.split(",");
            var arroldsortvalue=oldsortvalue.split(",");
            if(arrSort[0]==arroldsortvalue[0] && arrSort[1]==arroldsortvalue[1] && arrSort[2]==arroldsortvalue[2]) {
                sortnumobj.value = oldsortnumvalue;
                return ;
            }
        }
    }
    var params  = {
        'act'      :act,
        'tabname'  :tabname,
        'sortfiled':sortfiled,
        'sortValue':sortobj
    };
    $.ajax({
        url: url,         //接收页面
        type: 'post',     //POST方式发送数据
        async: false,    //ajax同步
        data: params,
		dataType:"json",
        success: function(msg) { 
            if(msg=='false') {
                alert("<s:text name=\'operate.error\'/>"); 
            }else{
                sortnumobj.value=msg;
            }
        }
    });  
}